package process

import (
	"encoding/json"
	"fmt"
	"go_example/src/chatroom/common/message"
	"go_example/src/chatroom/server/utils"
	"net"
)

type SmsProcess struct {
	//..
}

func (this *SmsProcess) SendExitMes(mes *message.Message) {
	var smsMes message.SmsExitMes
	err := json.Unmarshal([]byte(mes.Data), &smsMes)
	if err != nil {
		fmt.Println("SendExitMes() &loginMes json.Unmarshal err=", err)
		return
	}

	data, err := json.Marshal(mes)
	if err != nil {
		fmt.Println("SendUserIdMes() mes json.Marshal(mes) err=", err)
	}

	//将退出的用户从在线列表map中移除
	userId := smsMes.ExitId
	userMgr.DelOnlineUser(userId)

	for id, up := range userMgr.onlineUsers {
		if id == smsMes.UserId {
			continue
		}
		this.SendMesToEachOnlineUser(data, up.Conn)
	}

}
//处理消息单发的方法
func (this *SmsProcess) SendUserIdMes(mes *message.Message)  {
	var smsMes message.SmsUserIdMes
	err := json.Unmarshal([]byte(mes.Data), &smsMes)
	if err != nil {
		fmt.Println("SendUserIdMes() &smsMes json.Unmarshal err=", err)
	}
	data, err := json.Marshal(mes)
	if err != nil {
		fmt.Println("SendUserIdMes() mes json.Marshal(mes) err=", err)
	}

	for id, up := range userMgr.onlineUsers {
		if id == smsMes.ContextId {
			this.SendMesToEachOnlineUser(data, up.Conn)
		}
		if id != smsMes.ContextId {
			fmt.Println("该用户不在线，此消息转为离线留言。")
			continue
		}
	}
}

//处理消息群发的方法
func (this *SmsProcess) SendGroupMes(mes *message.Message)  {
	//遍历服务端维护消息map，转消息转发出去
	//取出mes的内容 SmsMes
	var smsMes message.SmsGroupMes
	err := json.Unmarshal([]byte(mes.Data), &smsMes)
	if err != nil {
		fmt.Println("SendGroupMes() &smsMes json.Unmarshal err=", err)
	}
	data, err := json.Marshal(mes)
	if err != nil {
		fmt.Println("SendGroupMes() mes json.Marshal(mes) err=", err)
	}
	for id, up := range userMgr.onlineUsers {
		//不需要给自己转发消息，过滤掉
		if id == smsMes.UserId {
			continue
		}
		this.SendMesToEachOnlineUser(data, up.Conn)
	}
}

//消息转发
func (this *SmsProcess) SendMesToEachOnlineUser(data []byte, conn net.Conn)  {
	//创建一个Transfer的实例，发送data
	tf := &utils.Transfer{
		Conn: conn,
	}
	err := tf.WritePkg(data)
	if err != nil {
		fmt.Println("消息转发失败 err=", err)
	}
}
